"""author: wenyao
   data: 2021/12/8
   project: cjh
"""

#高阶函数
#把函数作为参数传入，这样的函数称为高阶函数

def func1(x, y ,f):
    return f(x) + f(y)
num = func1(-10, 2, abs)
print(num)

#注意：  把函数作为参数传入的时候，不要在传入函数后面接括号
#       abs 代表这个取绝对值函数  abs() 表示调用这个函数，获取它的返回值

######常用高阶函数

#map
lst = [1,2,3,4,5,6,7]
result = []
for i in lst:
    result.append(i*i)
print(result)

print([x*x for x in lst])

#map - 映射函数
#    一般来说接收两个参数，第一个参数是要作用的函数，第二个参数是要作用的可迭代对象
#    返回值是一个迭代器

lst = [1,2,3,4,5,6,7]
lst2 = [10,100,1000,10000]
def f1(x,y):
    return x + y

#map后面可以接受多个可迭代对象，那传入几个可迭代对象，前面的函数就要接收几个参数
print(list(map(f1,lst, lst2)))
print(list(map(lambda x,y:x+y, lst, lst2)))

#  有列表[1,2,3,4,5]，将所有元素转换成str:['1','2','3','4','5']
#  有字符串'span'，将各字符转换成对应的ascii码的列表[115, 112, 97, 109]
#  有列表[-1,-2,0,1,2]，将各元素转换成绝对值
# 有一个列表[1.2344,45.345,34.09877,34.563465],将里面的数值换算成百分比都保留两位小数
# lst1 = [1,2,3,4,5]
# print(list(map(str,lst1)))
#
#
# str1 = "span"
# # def f1(str1):
# #     for i in str1:
# #         ask = ord(i)
# #         return ask
# print(list(map(ord,str1)))
#
# lst2 = [-1,-2,0,1,2]
# print(list(map(abs,lst2)))
#
# lst3 = [1.2344,45.345,34.09877,34.563465]
# print(list(map(lambda x:"%.2f%%"%(x*100),lst3)))

#####filter  过滤
#filter的第一个参数传入一个函数， 第二个参数是可迭代对象
#将可迭代对象里的每个值，交给传入的函数处理，如果结果为真，就保留这个值，如果结果为假，丢掉这个值
#filter 也是返回一个迭代器

#去掉偶数，保留奇数
# print(list(filter(lambda x: x%2, [1,2,3,4,5,6,7,8,9])))

# 把一个序列中的空字符串删掉，
# lst = ['A', '', 'B', None, 'C', '   ', 'a', 1, 0]
# print(list(filter(lambda x : x and str(x).strip(),lst)))

#水仙花数
#100 - 999
#153 = 1**3 + 5**3 + 3**3
# 水仙花数
# def f1(x):
#     return x==((x%10)**3+(x%100//10)**3+(x//100)**3)
# print(list(filter(f1, range(100,1000))))

# 100以内开平方是整数的数
# lst2 = [j for j in range(1,100)]
# print(list(filter(lambda x: (x ** 0.5) % 1 == 0, lst2)))

#100以内开平方是整数的数
#钱途

#sorted 排序
# lst = [2,-5,8,0,4,-3]
# print(sorted(lst, key=abs))
#
# lst = ['bob', 'about', 'Zoo', 'Credit']
# print(sorted(lst, key=lambda x:x.lower()))
# print(sorted(lst, key=str.lower))

#字典
#按照value来排序
# d1 = {"a":3,"b":4,"c":2,"d":5}
# print(dict(sorted(d1.items(), key=lambda x:x[1])))

#列表里包含元组的排序
# lst = [(True, 2),(False, 1, 2), (False,2,1), (1,0,2),(True,0,1)]
# print(sorted(lst))

# 将列表 [1`,3,5,7,9] --> 13579
from functools import reduce
print(reduce(lambda x,y: x*10 + y, [1,3,5,7,9]))

#"123"  --> 123
from functools import reduce
def custom_int(s):
    def char_to_number(string):
        all_number_dict = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
        # 以参数string为键，取出all_number_dict里面的值
        return all_number_dict[string]

    def result_number(x, y):
        res = x * 10 + y
        return res

    return reduce(result_number, map(char_to_number, s))
s='1234'
print(custom_int(s))
print(type(custom_int(s)))


